package com.zac.coroutine.algorithm.leetcode.others

/**
 * author zac
 * date 2024/11/21
 * 231. 2 的幂
 * 简单
 * 相关标签
 * premium lock icon
 * 相关企业
 * 给你一个整数 n，请你判断该整数是否是 2 的幂次方。如果是，返回 true ；否则，返回 false 。
 *
 * 如果存在一个整数 x 使得 n == 2x ，则认为 n 是 2 的幂次方。
 *
 */
object PowerOfTwo {
    @JvmStatic
    fun main(args: Array<String>) {
    }

    /**
     * 很妙的解法:
     * 如果 n是2的幂次方,那么n二进制表示一定会为 100(x个0)
     * 如假设 n=4
     * n的二进制表示为100
     * n=8 二进制表示为1000
     * n-1 = 7 的二进制表示是 0111
     * 那么n与n-1进行 '与' 运算则一定会 == 0
     *  1000
     * &0111
     * -----
     * =0000
     * 由此得出这样一种非常高效的算法
     */

    fun isPowerOfTwo(n: Int): Boolean {
        return n > 0 && (n.and(n - 1) == 0)
    }

}
